﻿// 804 瓜子.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <memory.h>
using namespace std;
/*

http://oj.daimayuan.top/course/5/problem/258

小L 买了 n 粒瓜子。

小L 每次都会从这堆瓜子中挑出一粒，他每次吃完一粒瓜子后，就会得到两瓣瓜子壳，他会把瓜子壳也丢进瓜子堆里面去。

如果他拿到了自己之前吃瓜子留下的瓜子壳，他就会把拿到的瓜子壳丢掉，否则就吃掉拿到的瓜子并且把瓜子壳丢进去。

现在设每次 小L 拿到每一粒瓜子或者是瓜子壳的概率是均等的，问 小L 期望多少次能够把瓜子拿完。

输入格式
一行一个正整数 n。

输出格式
一行一个整数表示结果对于 998244353 取模的结果。如果答案可以被表示成分数p/q
，其中p,q互质，那么输出一个数字r，满足qr≡p(mod998244353)。

样例输入
2
样例输出
3
样例解释
n=2的时候，这个时候 小L 第一次拿到的肯定是瓜子，然后现在瓜子堆里面有 1粒瓜子，2个瓜子壳。接下来他有 13的概率拿到瓜子，
有 23×13的概率第一次拿到瓜子壳，第二次拿到瓜子。还有 23×12=13的概率再拿两次都拿到瓜子壳，最后拿到瓜子。

所以期望的次数：2×13+3×13+4×13=3
数据规模对于 100%的数据满足 n≤2×103。
*/
int n;
long long f[2001][4001], a[4001];
const int p = 998244353;

long long rp(long long now, int k) {
    long long res = 1;
    for (; k; k >>= 1, now *= now, now %= p)
        if (k & 1)
            res *= now, res %= p;
    return res;
}

int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= 2 * n; i++)
        a[i] = rp(i, p - 2);
    for(int i = 1;i<=n;i++)
        for (int j = 0; j <= 2 * n - 2; j++) {
            f[i][j] = f[i - 1][j + 2] * i % p * a[i + j] % p;
            ++f[i][j];
            if (j)
                f[i][j] += f[i][j - 1] * j % p * a[i + j] % p;
        }
    
    printf("%d\n", f[n][0]);


    return 0;
}

 